// admin/system/handler/sys_dict_data_handler.go
package handler

import (
	"go-admin1/admin/system/model"
	"go-admin1/admin/system/service"
	"go-admin1/internal/common/utils"
	"strconv"

	"github.com/gin-gonic/gin"
)

// SysDictDataHandler 字典数据处理器
type SysDictDataHandler struct {
	dictDataService service.SysDictDataService
}

// NewSysDictDataHandler 创建字典数据处理器实例
func NewSysDictDataHandler(dictDataService service.SysDictDataService) *SysDictDataHandler {
	return &SysDictDataHandler{
		dictDataService: dictDataService,
	}
}

// Create 创建字典数据
func (h *SysDictDataHandler) Create(c *gin.Context) {
	var dictData model.SysDictData
	if err := c.ShouldBindJSON(&dictData); err != nil {
		utils.FailResponse[string](c, "参数解析失败")
		return
	}

	if err := h.dictDataService.Create(&dictData); err != nil {
		utils.FailResponse[string](c, "创建字典数据失败")
		return
	}
	utils.OkResponseNoDataWithMessage[string](c, "创建字典数据成功")
}

// GetByID 根据ID获取字典数据
func (h *SysDictDataHandler) GetByID(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		utils.FailResponse[string](c, "参数解析失败")
		return
	}

	dictData, err := h.dictDataService.GetByID(id)
	if err != nil {
		utils.FailResponse[string](c, "获取字典数据失败")
		return
	}
	utils.OkResponse(c, dictData)
}

// Update 更新字典数据
func (h *SysDictDataHandler) Update(c *gin.Context) {
	var dictData model.SysDictData
	if err := c.ShouldBindJSON(&dictData); err != nil {
		utils.FailResponse[string](c, "参数解析失败")
		return
	}

	if err := h.dictDataService.Update(&dictData); err != nil {
		utils.FailResponse[string](c, "更新字典数据失败")
		return
	}
	utils.OkResponseNoDataWithMessage[string](c, "更新字典数据成功")
}

// Delete 删除字典数据
func (h *SysDictDataHandler) Delete(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		utils.FailResponse[string](c, "参数解析失败")
		return
	}

	if err := h.dictDataService.Delete(id); err != nil {
		utils.FailResponse[string](c, "删除字典数据失败")
		return
	}
	utils.OkResponseNoDataWithMessage[string](c, "删除字典数据成功")

}

// List 字典数据列表
func (h *SysDictDataHandler) List(c *gin.Context) {
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10"))

	dictData, total, err := h.dictDataService.List(page, pageSize)
	if err != nil {
		utils.FailResponse[string](c, "获取字典数据列表失败")
		return
	}
	resultData := map[string]interface{}{
		"list":  dictData,
		"total": total,
	}
	utils.OkResponse(c, resultData)
}

// ListByDictType 根据字典类型获取字典数据列表
func (h *SysDictDataHandler) ListByDictType(c *gin.Context) {
	dictType := c.Query("dictType")
	if dictType == "" {
		utils.FailResponse[string](c, "字典类型不能为空")
		return
	}

	dictData, err := h.dictDataService.ListByDictType(dictType)
	if err != nil {
		utils.FailResponse[string](c, "获取字典数据列表失败")
		return
	}
	utils.OkResponse(c, dictData)

}

// ListByDictTypeAndStatus 根据字典类型和状态获取字典数据列表
func (h *SysDictDataHandler) ListByDictTypeAndStatus(c *gin.Context) {
	dictType := c.Query("dictType")
	status := c.Query("status")

	if dictType == "" {
		utils.FailResponse[string](c, "字典类型不能为空")
		return
	}

	dictData, err := h.dictDataService.ListByDictTypeAndStatus(dictType, status)
	if err != nil {
		utils.FailResponse[string](c, "获取字典数据列表失败")
		return
	}
	utils.OkResponse(c, dictData)
}
